/**
 * @file    pc_comm_fifo.h
 * @brief   PC通信FIFO处理服务
 * @details This is the detail description.
 * @author  wang-haoyu
 * @date    2025年7月29日 (created)
 * @version 0.0.2
 * @par Copyright (C):
 *          All Rights Reserved.
 * @par Encoding:
 *          GB2312
 * @par Description        :
 * 1. Hardware Descriptions:
 *      None.
 * 2. Program Architecture:
 *      None.
 * 3. File Usage:
 *      None.
 * 4. Limitations:
 *      None.
 * 5. Else:
 *      None.
 * @par Modification:
 * -# Date          : 2025年7月29日;
 * Revision         : 0.0.1;
 * Author           : wang-haoyu;
 * Contents         : first update
 */
 
/* =============================================================================
 *                                header files
 * ========================================================================== */
#ifndef __PC_COMM_FIFO_H
#define __PC_COMM_FIFO_H
#include "pc_comm_cfg.h"

/* =============================================================================
 *                              macros & constants
 * ========================================================================== */

/* =============================================================================
 *                          data structure definitions
 * ========================================================================== */
/***pc通信协议错误码枚举***/
 typedef enum
{
    E_PCCOMM_ENOERR   = 0 ,     // 无错误
    E_PCCOMM_EINIT    = -1,     // 初始化错误
    E_PCCOMM_ERELEASE = -2,     // 资源释放错误
    E_PCCOMM_EINVALID = -3,     // 参数无效
    E_PCCOMM_ESEND    = -4,     // 协议发送失败
    E_PCCOMM_ENODATA  = -5,     // 无数据
    E_PCCOMM_DATA_LENERR = -6,  //数据长度错误
}PCCOMM_FIFO_ENOERR_CODE;

/***pc通信fifo操作函数指针结构体***/
typedef struct 
{
    easy_fifo_t *(*pccomm_fifo_creat)(const char *name, unsigned int total_size, bool lock_enable);
    void (*pccomm_fifo_destroy)(easy_fifo_t *fifo);
    int (*pccomm_fifo_get_used)(easy_fifo_t *fifo);
    int (*pccomm_fifo_get_free)(easy_fifo_t *fifo);
    int (*pccomm_fifo_write)(easy_fifo_t *fifo,const void *src,unsigned int count);
    int (*pccomm_fifo_read)(easy_fifo_t *fifo,void *r_buffer,unsigned int count);
    int (*pccomm_fifo_pick)(easy_fifo_t *fifo,void *r_buffer,unsigned int count);
    int (*pccomm_fifo_cut)(easy_fifo_t *fifo,unsigned int count);
    void (*pccomm_fifo_clean)(easy_fifo_t *fifo);
}pccomm_fifo_operat_t;

/***pc通信fifo接口结构体***/
typedef struct 
{
    easy_fifo_t *fifo;
    char *fifo_name;
    rt_uint32_t fifo_size;
}pccomm_fifo_port_t;

/* =============================================================================
 *                         static variable definitions
 * ========================================================================== */

/* =============================================================================
 *                         static function definitions
 * ========================================================================== */

/* =============================================================================
 *                         global function definitions
 * ========================================================================== */
/*
 * PC通信数据帧创建函数
 *
 * Parameter:
 *   Input:
 *		-*obj：fifo接口句柄
 *   Output:
 * Returns:
 *		-PCCOMM_FIFO_ENOERR_CODE：返回状态
 */
PCCOMM_FIFO_ENOERR_CODE pc_comm_fifo_creat(pccomm_fifo_port_t *obj);

/*
 * PC通信数据帧销毁函数
 *
 * Parameter:
 *   Input:
 *		-*obj：fifo接口句柄
 *   Output:
 * Returns:
 *		-PCCOMM_FIFO_ENOERR_CODE：返回状态
 */
PCCOMM_FIFO_ENOERR_CODE pc_comm_fifo_release(pccomm_fifo_port_t *obj);

/*
 * PC通信数据帧写入函数
 *
 * Parameter:
 *   Input:
 *		-*obj：fifo接口句柄
 *   Output:
 * Returns:
 *		-PCCOMM_FIFO_ENOERR_CODE：返回状态
 */
PCCOMM_FIFO_ENOERR_CODE pc_comm_fifo_write(pccomm_fifo_port_t *obj,const void *wbuf,rt_uint32_t size);

/*
 * PC通信数据帧读取函数
 *
 * Parameter:
 *   Input:
 *		-*obj：fifo接口句柄
 *   Output:
 * Returns:
 *		-PCCOMM_FIFO_ENOERR_CODE：返回状态
 */
int pc_comm_fifo_read(pccomm_fifo_port_t *obj,void *rbuf,rt_uint32_t size);

/*
 * PC通信数据fifo获取使用内存大小函数
 *
 * Parameter:
 *   Input:
 *		-*obj：fifo接口句柄
 *   Output:
 * Returns:
 *		-fifo使用大小
 */
int pc_comm_fifo_get_used(pccomm_fifo_port_t *obj);

/*
 * PC通信数据fifo内存清空
 *
 * Parameter:
 *   Input:
 *		-*obj：fifo接口句柄
 *   Output:
 * Returns:
 *		返回状态
 */
void pc_comm_fifo_clean(pccomm_fifo_port_t *obj);

/*
 * PC通信数据fifo内存数据裁剪
 *
 * Parameter:
 *   Input:
 *		-*obj：fifo接口句柄
 *		-size:数据长度
 *   Output:
 * Returns:
 *		返回状态
 */
int pc_comm_fifo_cut(pccomm_fifo_port_t *obj,rt_uint32_t size);

/*
 * PC通信数据fifo内存数据读取指定长度
 *
 * Parameter:
 *   Input:
 *		-*obj：fifo接口句柄
 *		-*rbuf:数据存放buf
 *		-size:数据长度
 *   Output:
 * Returns:
 *		返回状态
 */
int pc_comm_fifo_pick(pccomm_fifo_port_t *obj,rt_uint8_t *rbuf,rt_uint32_t size);

#endif
/*******************************************************************************
 *                                  EOF
 ******************************************************************************/
